﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using MobiShop.Models;
using Microsoft.Web.Helpers;

namespace MobiShop.Controllers
{
    public class HomeController : Controller
    {
        MobishopEntities db = new MobishopEntities();
        //
        // GET: /Home/

        public ActionResult Index()
        {
            /* ---------Đạt------------*/
            //List 12 sản phẩm mới nhất
            List<Product> newestlist = ProductModels.NewestList(12);
            ViewBag.newestlist = newestlist;

            //list 12 sản phẩm bán chạy nhất
            List<Product> bestsalelist = ProductModels.BestSaleList(12);
            ViewBag.bestsalelist = bestsalelist;
            
            return View();           

        }
//Đạt
        public ActionResult Details(int id)
        {
            Product chitiet;
            MobishopEntities db = new MobishopEntities();
            try
            {
                chitiet = db.ProductList.Single(p => p.id == id && p.visible == true);
            }
            catch
            {
                chitiet = null;	
            }

            ViewBag.details = chitiet;
            if (chitiet != null)
            {
                // Hoàng: bổ sung 
                // ghi nhận thêm 1 lượt xem cho sản phẩm này
                // ghi chú: Cách làm này chỉ mang tính mô phỏng việc tăng lượt xem, 
                //   trong thực tế là ko chính xác
                chitiet.totalView += 1;
                db.SaveChanges();
                
                // lấy ra danh sách 4 sản phẩm cùng nhà sản xuất
                ViewBag._ListProduct = ProductModels.SanPhamCungNhaSanXuat(chitiet, 4);
            }

            return View();
        }
//Đạt
        public ActionResult ListByCat(int id, int page)
        {
            if (id <= 0 || page <= 0) return View();
            // get product list
            int totalproduct;
            List<Product> lbc = ProductModels.ProByCat(id, page, out totalproduct);
            
            ViewBag.cat = CategoryModels.GetById(id);

            //get total page
            int totalpage = totalproduct / 8;
            if ((totalproduct % 8) != 0)
                totalpage = (totalproduct / 8) + 1;

            // rót dữ liệu cho các Partial View
            ViewBag._ListProduct = lbc;
            ViewBag._tongSoTrang = totalpage;
            ViewBag._trangHienTai = page;
            ViewBag._MyURL = "/Home/ListByCat/" + id;

            return View();
        }
//Đạt
        public ActionResult ListByManu(int id, int page)
        {
            if (id <= 0 || page <= 0) return View();
            
            //get product list to viewbag
            int totalproduct;
            List<Product> lbm = ProductModels.ProByManu(id, page, out totalproduct);
            
            ViewBag.manu = ManufactureModels.GetById(id);

            //get total page
            int totalpage = totalproduct / 8;
            if ((totalproduct % 8) != 0)
                totalpage = (totalproduct / 8) + 1;

            // rót dữ liệu cho các Partial View
            ViewBag._ListProduct = lbm;
            ViewBag._tongSoTrang = totalpage;
            ViewBag._trangHienTai = page;
            ViewBag._MyURL = "/Home/ListByManu/" + id;

            return View();
        }

//Đạt   
//Search function
        // [HttpPost]
        // edit : chuyển sang giao thức GET
        public ActionResult BasicSearch(int id = 1, string textsearch="")
        {
            if (id <= 0) return View();
            int totalproduct;
            // nạp dữ liệu cho các Partial
            ViewBag._ListProduct = ProductModels.getProductByName(textsearch, 8, id, out totalproduct);

            int totalpage = totalproduct / 8;
            if ((totalproduct % 8) != 0)
                totalpage = (totalproduct / 8) + 1;

            ViewBag._ChuoiTieuDe = "Kết quả tìm kiếm :";
            ViewBag.totalproduct = totalproduct;
            ViewBag._tongSoTrang = totalpage;
            ViewBag._trangHienTai = id;
            ViewBag._MyURL = "/Home/BasicSearch/";
            ViewBag._Query = "?textsearch=" + textsearch;
            ViewBag._UseIdForPaging = true; // dùng id làm chỉ số trang. 
            // VD, để tìm kiếm chuỗi "nokia", trang 2, ta dùng URL /Home/BasicSearch/2?textsearch=nokia

            return View();
        }

//Đạt
//Advance search
        // edit : chuyển toàn bộ sang giao thức GET
        public ActionResult AdvanceSearch(string txtName, int?ddlManu, int? ddlCat, int? ddlRegion,
           decimal? txtPriceFrom, decimal? txtPriceTo, int id=1)
        {
            ViewBag.listManufacture = new SelectList(ManufactureModels.getManufactureList(), "id", "name", ddlManu);
            ViewBag.listCategory = new SelectList(CategoryModels.CatMenu(), "id", "name", ddlCat);
            ViewBag.listRegion = new SelectList(RegionModels.GetList(), "id", "name", ddlRegion);

            ViewBag.txtName = txtName;
            ViewBag.txtPriceFrom = Request.QueryString["txtPriceFrom"];
            ViewBag.txtPriceTo = Request.QueryString["txtPriceTo"];

            if (Request.QueryString["btnSeach"] != null) // Có yêu cầu tìm kiếm ?
            {
                int totalproduct;
                ViewBag._ListProduct = ProductModels.advanceSearch(txtName, ddlManu, ddlCat, ddlRegion,
                    txtPriceFrom, txtPriceTo, 8, id, out totalproduct);

                int totalpage = totalproduct / 8;
                if ((totalproduct % 8) != 0)
                    totalpage = (totalproduct / 8) + 1;

                ViewBag.totalproduct = totalproduct;
                ViewBag._tongSoTrang = totalpage;
                ViewBag._trangHienTai = id;
                ViewBag._MyURL = "/Home/AdvanceSearch/";
                ViewBag._Query = Request.Url.Query;
                ViewBag._UseIdForPaging = true;
            }
            
            return View();
        }

        // Hoàng
        public ActionResult Login()
        {
            if (Session["Account"] != null) // đã đăng nhập => chuyển hướng người dùng về lại trang index
                return RedirectToAction("Index", "Home");

            return View();
        }

        // Hoàng
        // Hàm đăng nhập sau khi người dùng nhập liệu và click nào nút đăng nhập
        // chưa làm : sau khi đăng nhập, chuyển hướng người dùng về trang trước đó ( có cần ko ta ??? )
        [HttpPost]
        public ActionResult Login(LogOnModel logOn)
        {
            Account account = (Account)Session["Account"];
            if (account != null) // đã đăng nhập => chuyển hướng người dùng về lại trang index
                return RedirectToAction("Index", "Home");
            if (!ModelState.IsValid) // kiểm tra dữ liệu nhập tại server
            {
                ViewBag.ThongBao = "Thao tác đăng nhập không hợp lệ !";
                return View();
            }

            string username = logOn.username.Trim();
            string password = logOn.password.Trim();
            bool ghiNho = logOn.rememberMe;

            account = AccountModels.Login(username, password);
            if (AccountModels.IsAllowAccount(account))
            {
                Session["Account"] = account;
                if (ghiNho)
                    AccountModels.WriteCookies(account, Response);
                // Đăng nhập, thành công, chuyển hướng người dùng tạm thời về trang index
                return RedirectToAction("Index", "Home");
            }

            ViewBag.ThongBao = "Tên đăng nhập hoặc mật khẩu không đúng. Xin hãy nhập lại :";
            return View();
        }

        // hoàng
        public ActionResult Logout()
        {
            Session["Account"] = null;
            AccountModels.WriteCookies(null, Response); // xóa cookies 
            string path;
            if (Request.UrlReferrer!=null && Request.Url!=null && 
                Request.Url.Host == Request.UrlReferrer.Host)
                path = Request.UrlReferrer.ToString();
            else path = "/Home/Index";
            return Redirect(path);
        }

        public ActionResult Register()
        {
            if (Session["Account"] != null) return RedirectToAction("Index", "Home");

            return View();
        }

        [HttpPost]
        public ActionResult Register(AccountRegisterModel account)
        {
            if (Session["Account"] != null) return RedirectToAction("Index", "Home");
            if (!ReCaptcha.Validate(AccountRegisterModel.primaryGoogleCapchaKey)) //System.Configuration.ConfigurationManager.AppSettings["primaryGoogleCapchaKey"]))
            {
                ViewBag.ThongBao = "Mã xác nhận sai, yêu cầu nhập lại !";
                return View();
            }
            // kiểm tra dữ liệu nhập tại server
            if(!ModelState.IsValid)
            {
                ViewBag.ThongBao = "Thông tin đăng ký không hợp lệ !";
                return View();
            }
            string checkResult = account.checkValid();
            if (checkResult.Length >0 )
            {
                ViewBag.ThongBao = checkResult;
                return View();
            }

            Account new_account;
            // ok, ghi tài khoản mới xuống CSDL
            try
            {
                new_account = account.WriteToDatabase();
            }
            catch (System.Exception)
            {
                ViewBag.ThongBao = "Ghi tài khoản xuống CSDL thất bại";
                return View();
            }

            // thành công, tiến hành đăng nhập tự động cho người dùng và chuyển hướng đến trang thông báo
            Session["Account"] = new_account;
            return RedirectToAction("RegisterFinish");
        }

        public ActionResult RegisterFinish()
        {
            return View();  
        }
    }
}
